package persistencia.csv.pruebas;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import persistencia.IProducto;
import persistencia.compartido.Tipo;
import persistencia.csv.AlmacenCSV;
import persistencia.csv.EncabezadoCSV;
import persistencia.csv.GondolaCSV;
import persistencia.csv.ProductoCSV;
import persistencia.pruebas.EnsambladorEjemplo;
import persistencia.pruebas.EntidadEjemplo;

import compartido.IEntidad;

public class TestGondolaCSV {

	protected String separador;
	protected File directorio;
	protected AlmacenCSV almacen;
	protected GondolaCSV gondola;
	protected EnsambladorEjemplo ensamblador;
	protected Tipo<IEntidad> te;
	protected Tipo<IProducto> tp;
	
	@Before
	public void setUp() throws Exception {		
		te = new Tipo<IEntidad>(EntidadEjemplo.class);
		tp = new Tipo<IProducto>(ProductoCSV.class);
		directorio = new File(".");
		
		File f = new File(directorio.getPath()+"/"+te.getNombre()+".csv");
		if (f.exists())
			f.delete();
		
		almacen = new AlmacenCSV();
		ensamblador = new EnsambladorEjemplo();
		almacen.registrarEnsamblador(te,ensamblador);
		almacen.abrir(".");
		
		gondola = (GondolaCSV) almacen.crearGondola(te);
		EntidadEjemplo auxiliar = new EntidadEjemplo("","");
		gondola.configurar(auxiliar);
	}

	@After
	public void tearDown() throws Exception {
		almacen.guardar();
		almacen.cerrar();
		
		File directorio = new File(".");
		if (directorio.exists()) {
			File[] archivos = directorio.listFiles();
			for (int i = 0; i < archivos.length; i++) {
				if (archivos[i].getName().endsWith(".csv"))
					archivos[i].delete();
			}
		}
		
	}

	@Test
	public void testEncabezado() {
		EncabezadoCSV original = gondola.getEncabezado();
		gondola.guardar();
		
		gondola = null;
		System.gc();

		gondola = (GondolaCSV) almacen.crearGondola(te);
		EncabezadoCSV leido = gondola.getEncabezado();
		
		if (original.CantidadDeCampos() != leido.CantidadDeCampos())
			fail("Uno de los encabezados tiene más campos que el otro.");

		if (original.toString().compareTo(leido.toString()) != 0) 
			fail("No se obtienen correctamente los encabezados.");

		try {
			BufferedReader bf = new BufferedReader(new FileReader(te.getNombre()+".csv"));
			
			String linea = bf.readLine();
			String encabezadoEsperado = leido.toString();
			if ((linea==null) || (linea.compareTo(encabezadoEsperado) != 0))
				fail("No se guarda correctamente el encabezado.");
			if (bf.readLine() != null)
				fail("No se crea un archivo con solo el encabezado.");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Test
	public void testAgregar() {
		EntidadEjemplo ejemplo = new EntidadEjemplo("Primero","1");
		gondola.agregar(ejemplo);
		
		gondola.guardar();
		gondola = null;
		System.gc();
		
		gondola = (GondolaCSV) almacen.crearGondola(te);

		Iterator<IEntidad> it = gondola.getIterator();
		
		if (!it.hasNext())
			fail ("No se recupera correctamente el primer elemento agregado.");
		
		if (it.next().getIdentificador().compareTo("Primero")!=0)
			fail ("No se almacena correctamente un elemento.");
		
	}

	@Test
	public void testEliminar() {
		EntidadEjemplo ejemplo = new EntidadEjemplo("","");

		ejemplo = null;
		
		ejemplo = new EntidadEjemplo("Primero","1");
		gondola.agregar(ejemplo);
		
		ejemplo = new EntidadEjemplo("Segundo","2");
		gondola.agregar(ejemplo);
		
		ejemplo = new EntidadEjemplo("Tercero","3");
		gondola.agregar(ejemplo);
		
		gondola.guardar();
		gondola = null;
		System.gc();
		
		gondola = (GondolaCSV) almacen.crearGondola(te);
		
		IEntidad eliminada = gondola.obtener("Primero");
		gondola.eliminar(eliminada);
		
		IEntidad aux = gondola.obtener("Primero");
		if (aux != null)
			fail ("Falla el borrado de un registro");		
	}

	@Test
	public void testModificar() {
		EntidadEjemplo ejemplo = null;
		
		ejemplo = new EntidadEjemplo("Primero","1");
		gondola.agregar(ejemplo);
		
		ejemplo = new EntidadEjemplo("Segundo","2");
		gondola.agregar(ejemplo);
		
		ejemplo = new EntidadEjemplo("Tercero","3");
		gondola.agregar(ejemplo);
		
		gondola.guardar();
		gondola = null;
		System.gc();
		
		gondola = (GondolaCSV)almacen.crearGondola(te);
		
		EntidadEjemplo modificada = (EntidadEjemplo) gondola.obtener("Primero");
		modificada.setAtributo("I");
		
		gondola.modificar(modificada);
		
		modificada = (EntidadEjemplo) gondola.obtener("Primero");
		if (modificada == null)
			fail ("La modificación solo borra la entidad.");
		if (modificada.getAtributo().compareTo("I") != 0)
			fail ("No se guardan los cambios realizandos sobre los atribtuos de una entidad");
	}
}
